iT邦幫忙

2023 iThome 鐵人賽

DAY 14
0
Security

從自建漏洞中學習 - 一起填坑吧系列 第 14

Node.js 安全最佳實踐 - 1 (第三方套件篇)

  • 分享至 

  • xImage
  •  

Node.js 安全最佳實踐 - 1 (第三方套件篇)

由於我這次的 Auth 功能相關實作後端會使用 Node.js 來進行開發,所以在進行這次的 Auth 相關實作前,我們先來看看 Node.js 的注意事項以及相關的安全實踐吧 ~

這個部分會分為兩個部分做講解,第一個部分是使用第三方 libraries,而第二個部分則會講解其他程式碼需要注意的實踐部分~

注意使用的 libraries

原因

因為目前在 Node.js 中,任何套件都可以存取強大的資源,例如:網路存取。
此外,由於它們還可以存取檔案系統,因此它們可以將任何資料發送到任何地方

所有運行在 node process 中的程式碼都能通過使用 eval() 來載入和執行其他任意程式碼。
所有具有文件系統寫入權限(write access) 的程式碼都可以通過寫入加載的新文件或現有文件來實現相同的目的。

如何檢測來 libraries 是否可信?

    1. 可以使用 Node.js 實驗性質的策略機制

    策略的重點是首先防止惡意程式碼完全載入到應用程式中,而最佳實踐是確保策略清單對於正在運行的 Node.js 應用程式是唯讀的,並且該檔案不能被正在運行的 Node.js 應用程式以任何方式更改。

    透過此方式,可以藉此聲明該加載的資源是不是不受信任的

    以下介紹幾個範例,如有需要可以查看原文件 (https://nodejs.org/api/permissions.html#policies)

    • 使用範例介紹:

      • 使用 --experimental-policy flag 可用於在載入模組時啟用原則功能。

        設定後,所有模組都必須符合傳遞給該標誌的策略清單檔案 (policy.json):

        node --experimental-policy=policy.json app.js 
        

        策略清單將用於對 Node.js 載入的程式碼實施約束。

        為了減少對磁碟上策略檔案的竄改,可以透過 --policy-integrity 提供策略檔案本身的完整性。即使檔案在磁碟上發生更改,這也允許運行節點並斷言策略檔案內容。

        node --experimental-policy=policy.json --policy-integrity="sha384-SggXRQHwCG8g+DktYYzxkXRIkTiEYWBHqev0xnpCxYlqMBufKZHAHQM3/boDaI/0" app.js
        
    • 完整性檢查:

      策略檔案必須使用子資源完整性字串的完整性檢查,該字串與絕對 URL 關聯的瀏覽器完整性屬性相容。

      • 為什麼需要檢查?

        Node.js 會使用 Modules All Together 的方法(https://nodejs.org/api/modules.html#all-together) 加載模塊,而當我們使用require()來加載模塊時,會以以下方式取得資料。

        請看以下範例,假設我們有以下的檔案目錄結構:

        app/
        server.js
        checked.js
        checked
        

        若我們在 server.js 中使用 require('./checked'),依據 Modules All Together 的方法,他會載入 checked

      • 完整性檢查的使用方式:

        當使用 require()import 時,如果開發者已指定策略清單,則會檢查載入中涉及的所有資源的完整性。

        如果資源與清單中列出的完整性不匹配,則會拋出錯誤。

        允許載入檔案checked.js的範例 policy.json

            {
                 "resources": {
                   "./app/checked.js": {
                     "integrity": "sha384-SggXRQHwCG8g+DktYYzxkXRIkTiEYWBHqev0xnpCxYlqMBufKZHAHQM3/boDaI/0"
                   },
                   "./app/server.js": {
                     "dependencies": {
                        "./checked": "./app/checked.js"
                     },
                     "integrity": "sha384-SggXRQHwCG8g+DktYYzxkXRIkTiEYWBHqaa0xnpCxYlqMBufKZHAHQM4/boDaI/0"
                   },
                 }
           }
        
    • 接著,我們再啟用策略機制:

      node --experimental-policy=policy.json app/server.js 
      
    1. 在安裝套件之前,請確保該套件已維護並包含期望的所有內容:

    由於 Github 原始程式碼並不總是與已發布的原始程式碼相同,請在 node_modules 中驗證它。

    1. 在更新方面,避免不必要的更新並導入檢查
    • 可以使用 npm ci 來替換 npm install:

      因為這會強制執行 loackfile,並且會將原有 node module 給刪除,執行比較 clean 的 install,避免與 package.json 文件之間不同而產生的衝突。

    • npm audit 導入 ci 中:

      npm audit 可以幫忙檢查漏洞。


今日小心得

最近心情稍微混亂一些,原本中秋節應該好好的在家裡把所有想做的事情完成,但突然身體不舒服躺了一天QQ
還好到今天晚餐吃烤肉前有恢復精力QQ (可能是烤肉之神眷顧我吧
明天一定要好好把剩下的安全實踐完成才行~ 完成後就是我最期待的安全實作的研究啦! Fighting!


Reference


上一篇
Insecure Design
下一篇
Node.js 安全最佳實踐 - 2 (其他實踐篇)
系列文
從自建漏洞中學習 - 一起填坑吧30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言